package com.greensam.pixelengine.manager.auth;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.json.JSONUtil;
import com.greensam.pixelengine.manager.auth.model.SpaceUserAuthConfig;
import com.greensam.pixelengine.manager.auth.model.SpaceUserPermission;
import com.greensam.pixelengine.manager.auth.model.SpaceUserRole;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import java.util.*;
import java.util.stream.Collector;
import java.util.stream.Collectors;

/**
 * 空间用户权限管理器
 *
 * @author Ma Chengrui
 * @since 2025/9/28 14:19
 */
@Component
public class SpaceUserAuthManager {

    public static final SpaceUserAuthConfig SPACE_USER_AUTH_CONFIG;

    private static final Map<String, SpaceUserRole> ROLE_MAP = new HashMap<>();
    private static final Map<String, SpaceUserPermission> PERMISSION_MAP = new HashMap<>();

    static {
        // 读取 JSON 权限配置文件
        String json = ResourceUtil.readUtf8Str("biz/SpaceUserAuthConfig.json");
        SPACE_USER_AUTH_CONFIG = JSONUtil.toBean(json, SpaceUserAuthConfig.class);

        // 建立索引，方便快速查询
        if (CollectionUtil.isNotEmpty(SPACE_USER_AUTH_CONFIG.getRoles())) {
            SPACE_USER_AUTH_CONFIG.getRoles().forEach(role -> ROLE_MAP.put(role.getKey(), role));
        }
        if (CollectionUtil.isNotEmpty(SPACE_USER_AUTH_CONFIG.getPermissions())) {
            SPACE_USER_AUTH_CONFIG.getPermissions().forEach(permission -> PERMISSION_MAP.put(permission.getKey(), permission));
        }
    }

    /**
     * 根据角色获取权限key列表
     *
     * @param roleCode 空间用户的角色code
     * @author Ma Chengrui
     * @since 2025/9/28
     */
    public List<String> listPermissionsByRole(String roleCode) {
        if (StringUtils.isBlank(roleCode)) {
            return Collections.emptyList();
        }
        SpaceUserRole role = ROLE_MAP.get(roleCode);
        return role == null ? Collections.emptyList() : role.getPermissions();
    }

    /**
     * 根据角色获取权限详情
     *
     * @param roleCode 空间用户的角色code
     * @author Ma Chengrui
     * @since 2025/9/29
     */
    public List<SpaceUserPermission> listPermissionDetailsByRole(String roleCode) {
        if (StringUtils.isBlank(roleCode)) {
            return Collections.emptyList();
        }
        SpaceUserRole role = ROLE_MAP.get(roleCode);
        if (role == null) {
            return Collections.emptyList();
        }
        return role.getPermissions().stream()
                .map(PERMISSION_MAP::get)
                .filter(Objects::nonNull)
                .toList();
    }

    /**
     * 获取所有角色定义
     */
    public Collection<SpaceUserRole> listAllRoles() {
        return ROLE_MAP.values();
    }

    /**
     * 获取所有权限定义
     */
    public Collection<SpaceUserPermission> listAllPermissions() {
        return PERMISSION_MAP.values();
    }

    /**
     * 获取角色定义
     */
    public SpaceUserRole getRole(String roleCode) {
        return ROLE_MAP.get(roleCode);
    }

    /**
     * 获取权限定义
     */
    public SpaceUserPermission getPermission(String permissionKey) {
        return PERMISSION_MAP.get(permissionKey);
    }


}
